using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using TaskScheduler.Core;
using TaskScheduler.Infrastructure.DataAccess;
using TaskScheduler.Infrastructure.Services;

namespace TaskScheduler.Console;

class Program
{
    /// <summary>
    /// 主程序入口，负责初始化主机、注册任务并启动调度器
    /// </summary>
    /// <param name="args">命令行参数</param>
    static async Task Main(string[] args)
    {
        // 创建并构建主机（Host），用于管理服务和依赖注入
        var host = CreateHostBuilder(args).Build();
        
        System.Console.WriteLine("任务调度器启动中...");
        System.Console.WriteLine("按 Ctrl+C 退出程序");
        
        // 通过依赖注入获取调度器和日志服务
        var scheduler = host.Services.GetRequiredService<ITaskScheduler>();
        var logger = host.Services.GetRequiredService<ILogger<Program>>();
        
        // 注册任务，传入 host.Services
        RegisterTasks(scheduler, logger, host.Services);
        
        // 启动调度器
        await scheduler.StartAsync();

        //立即执行
        
        
        // 等待程序退出
        await host.RunAsync();
    }

    /// <summary>
    /// 创建主机构建器，注册所有服务（调度器、任务、日志等）
    /// </summary>
    /// <param name="args">命令行参数</param>
    /// <returns>主机构建器</returns>
    private static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((context, services) =>
            {
                // 注册调度器为单例服务
                services.AddSingleton<ITaskScheduler, Core.TaskScheduler>();
                
                // 注册 SqlSugar 数据库上下文
                services.AddSingleton<SqlSugarContext>();
                
                // 注册 HttpClient 工厂
                services.AddHttpClient();
                
                // 注册自定义服务
                services.AddScoped<IFeishuService, FeishuService>();
                services.AddScoped<IEmailService, EmailService>();
                
                // 注册任务为瞬时服务（每次获取新实例）
                services.AddTransient<TaskScheduler.Tasks.HelloWorldTask>();
                services.AddTransient<TaskScheduler.Tasks.DataSyncTask>();
                services.AddTransient<TaskScheduler.Tasks.DailyReportTask>();
                services.AddTransient<TaskScheduler.Tasks.HealthCheckTask>();
                services.AddTransient<TaskScheduler.Tasks.CleanupTask>();
                services.AddTransient<TaskScheduler.Tasks.WeeklyReportTask>();
                
                // 配置日志
                services.AddLogging(builder =>
                {
                    builder.AddConsole();
                    builder.SetMinimumLevel(LogLevel.Information);
                });
            });
    
    /// <summary>
    /// 注册要定时执行的任务
    /// </summary>
    /// <param name="scheduler"></param>
    /// <param name="logger"></param>
    /// <param name="serviceProvider"></param>
    private static void RegisterTasks(ITaskScheduler scheduler, ILogger logger, IServiceProvider serviceProvider)
    {
        try
        {
            // 注册示例任务
            // 可以根据需要启用或禁用某些任务
            
            // 1. Hello World 示例任务 - 每分钟执行
            scheduler.AddTask(serviceProvider.GetRequiredService<TaskScheduler.Tasks.HelloWorldTask>());
            
            // 2. 数据同步任务 - 每天凌晨2点
            scheduler.AddTask(serviceProvider.GetRequiredService<TaskScheduler.Tasks.DataSyncTask>());
            
            // 3. 每日报表任务 - 每天早上9点
            scheduler.AddTask(serviceProvider.GetRequiredService<TaskScheduler.Tasks.DailyReportTask>());
            
            // 4. 健康检查任务 - 每5分钟
            scheduler.AddTask(serviceProvider.GetRequiredService<TaskScheduler.Tasks.HealthCheckTask>());
            
            // 5. 清理任务 - 每天凌晨3点
            scheduler.AddTask(serviceProvider.GetRequiredService<TaskScheduler.Tasks.CleanupTask>());
            
            // 6. 周报任务 - 展示如何使用自定义服务
            scheduler.AddTask(serviceProvider.GetRequiredService<TaskScheduler.Tasks.WeeklyReportTask>());
            
            // 显示所有已注册的任务
            var allTasks = scheduler.GetAllTasks();
            System.Console.WriteLine("\n已注册的任务列表:");
            foreach (var task in allTasks)
            {
                System.Console.WriteLine($"- {task.TaskName}: {task.Description}");
                System.Console.WriteLine($"  执行时间: {task.CronExpression}");
                System.Console.WriteLine($"  状态: {(task.IsEnabled ? "启用" : "禁用")}");
            }
            System.Console.WriteLine();
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "注册任务时发生错误");
        }
    }
} 